﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

using DTO;
using System.Transactions;
using AutoMapper;

namespace DAO
{
    public class PhieuMuonSachDAO
    {
        public static List<SachDTO> SachDangMuon(int maDocGia)
        {
            //tạo list
            List<SachDTO> list = new List<SachDTO>();

            //khởi tạo datacontext
            QuanLyThuVienDataContext context = new QuanLyThuVienDataContext();

            //đọc lên danh sách phiếu mượn của độc giả
            var ds = context.PhieuMuonSaches.Where(c => c.MaDocGia == maDocGia);

            //duyệt danh sách các phiếu mượn sách của độc giả
            foreach (PhieuMuonSach pms in ds)
            {
                //duyệt các chi tiết phiếu mượn
                foreach (ChiTietPhieuMuon ctpm in pms.ChiTietPhieuMuons)
                {
                    //nếu chưa đánh dấu xóa thì mới đọc
                    if (ctpm.DanhDau == 1)
                        continue;

                    //đọc từng cuốn sách
                    Sach n = context.Saches.SingleOrDefault(c => c.MaSach == ctpm.MaSach && c.MaTinhTrang == 2);

                    //trường hợp không tin thấy như điều kiện thì tiếp tục tìm cuốn sách khác
                    if (n == null)
                        continue;

                    //mapping từ linQ vào dto
                    SachDTO dto = new SachDTO();
                    Mapper.CreateMap<Sach, SachDTO>();
                    dto = Mapper.Map<Sach, SachDTO>(n);

                    //thêm vào danh sách
                    list.Add(dto);
                }
            }

            return list;
        }

        public static List<SachDTO> SachMuonQuaHan(int maDocGia)
        {
            //tạo list
            List<SachDTO> list = new List<SachDTO>();

            //khởi tạo datacontext
            QuanLyThuVienDataContext context = new QuanLyThuVienDataContext();

            //đọc lên danh sách phiếu mượn của độc giả
            var ds = context.PhieuMuonSaches.Where(c => c.MaDocGia == maDocGia);

            //duyệt danh sách các phiếu mượn sách của độc giả
            foreach (PhieuMuonSach pms in ds)
            {
                //public static int Compare(
                //DateTime t1,
                //DateTime t2
                //)
                //Condition
                //Less than zero => t1 is earlier than t2.
                //Zero => t1 is the same as t2.
                //Greater than zero => t1 is later than t2.

                //nếu phiếu mượn quá hạn
                if (DateTime.Compare(pms.NgayHetHan, DateTime.Today) < 0)
                    //duyệt các chi tiết của phiếu mượn
                    foreach (ChiTietPhieuMuon ctpm in pms.ChiTietPhieuMuons)
                    {
                        //nếu chưa đánh dấu xóa thì mới đọc
                        if (ctpm.DanhDau == 1)
                            continue;

                        //đọc từng cuốn sách
                        Sach n = context.Saches.SingleOrDefault(c => c.MaSach == ctpm.MaSach && c.MaTinhTrang == 2);

                        if (n == null)
                            continue;

                        //mapping từ linQ vào dto
                        SachDTO dto = new SachDTO();
                        Mapper.CreateMap<Sach, SachDTO>();
                        dto = Mapper.Map<Sach, SachDTO>(n);

                        //thêm vào danh sách
                        list.Add(dto);
                    }
            }

            return list;
        }

        public static bool Them(PhieuMuonSachDTO dto, List<SachDTO> listSachMuon)
        {
            using (TransactionScope scope = new TransactionScope())
            {
                //khởi tạo datacontext
                QuanLyThuVienDataContext context = new QuanLyThuVienDataContext();

                //tạo phieumuonsach entity
                PhieuMuonSach pms = new PhieuMuonSach();

                //mapping từ dto sang entity
                Mapper.CreateMap<PhieuMuonSachDTO, PhieuMuonSach>();
                pms = Mapper.Map<PhieuMuonSachDTO, PhieuMuonSach>(dto);

                //duyệt danh sách sách
                foreach (SachDTO sach in listSachMuon)
                {
                    //Danh dau = 0: chưa xóa
                    //Danh dau = 1: đã xóa

                    //tao đối tượng chi tiết có mã sách là mã sách của sachdto
                    ChiTietPhieuMuon ctpm = new ChiTietPhieuMuon { MaSach = sach.MaSach, DanhDau = 0 };

                    //thêm chi tiết cho phiếu mượn sách
                    pms.ChiTietPhieuMuons.Add(ctpm);

                    //đọc sách lên và cập nhật lại tình trạng của sách
                    Sach s = context.Saches.Single(c => c.MaSach == sach.MaSach);
                    s.MaTinhTrang = 2;
                }

                //thêm entity phieumuonsach vào context
                context.PhieuMuonSaches.InsertOnSubmit(pms);

                //thực thi
                context.SubmitChanges();

                //kết thúc
                scope.Complete();
            }
            return true;
        }
    }
}
